import { Request, Response, NextFunction, RequestHandler } from 'express';

/**
 * 认证中间件 - 检查用户是否已登录
 */
export const isAuthenticated: RequestHandler = (req, res, next) => {
  if (req.isAuthenticated()) {
    // 用户已登录，继续执行下一个中间件
    return next();
  }
  // 用户未登录，重定向到登录页面
  res.redirect('/users/login');
}

/**
 * 角色权限验证中间件 - 检查用户是否具有指定的角色
 * @param allowedRoleIds 允许访问的角色ID数组，例如 [1, 2] 表示允许 admin 和 user
 */
export function hasRole(...allowedRoleIds: number[]) {
  return (req: Request, res: Response, next: NextFunction) => {
    // 首先检查用户是否已登录
    if (!req.isAuthenticated()) {
      return res.redirect('/users/login');
    }

    // 检查用户是否有 role_id 属性
    const user = req.user as any;
    if (!user || !user.role_id) {
      return res.status(403).json({
        success: false,
        message: '无法获取用户角色信息'
      });
    }

    // 检查用户的角色是否在允许的角色列表中
    if (allowedRoleIds.includes(user.role_id)) {
      return next();
    }

    // 用户角色不匹配，返回403禁止访问
    return res.status(403).json({
      success: false,
      message: '权限不足，无法访问此资源'
    });
  };
}

/**
 * 仅管理员可访问的中间件
 */
export function isAdmin(req: Request, res: Response, next: NextFunction) {
  return hasRole(1)(req, res, next); // roleId = 1 是 admin
}

/**
 * 普通用户可访问的中间件
 */
export function isUser(req: Request, res: Response, next: NextFunction) {
  return hasRole(1, 2)(req, res, next); // roleId = 1 (admin) 或 2 (user)
}
